from typing import Optional, List

from pydantic import BaseModel

from .base import OutputBase


class MeetingDetailUser(BaseModel):
    # 调用方用于标示用户的唯一 ID。
    userid: str

    # 用户 ID 类型。
    # 1：userid
    # 2：openid
    # 3：rooms_id
    # 4：ms_open_id
    operator_id_type: int

    # 用户 ID。
    operator_id: str


class MeetingDetailSetting(BaseModel):
    """
    会议的配置
    """

    # 成员入会时静音选项。
    # 当同时返回“mute_enable_join”和“mute_enable_type_join”时，请以“mute_enable_type_join”的结果为准。
    # 0：关闭
    # 1：开启
    # 2：超过6人后自动开启
    mute_enable_type_join: int

    # 加入静音状态，默认值为true。
    # true：开启
    # false：关闭
    mute_enable_join: bool

    # 是否允许参会者取消静音，默认值为true。
    # true：开启
    # false：关闭
    allow_unmute_self: bool

    # 是否允许成员在主持人进会前加入会议，默认值为 true。
    # true：允许
    # false：不允许
    allow_in_before_host: bool

    # 是否开启等候室，默认值为 false。
    # true：开启
    # false：不开启
    auto_in_waiting_room: bool

    # 是否开启屏幕共享水印，默认值为 false。
    # true： 开启
    # false：不开启
    allow_screen_shared_watermark: bool

    # 水印样式，默认为单排：
    # 0：单排
    # 1：多排
    water_mark_type: int = None

    # （旧参数）是否仅企业内部成员可入会。
    # true：仅企业内部用户可入会
    # false：所有人可入会
    only_allow_enterprise_user_join: bool = None

    # 成员入会限制。
    # 1：所有成员可入会
    # 2：仅受邀成员可入会
    # 3：仅企业内部成员可入会
    # 当 only_user_join_type 和 only_allow_enterprise_user_join 同时传的时候，以 only_user_join_type 为准。
    only_user_join_type: int

    # 自动录制类型，仅客户端2.7及以上版本生效。
    # none：禁用
    # local：本地录制
    # cloud：云录制
    auto_record_type: str

    # 当有参会成员入会时立即开启云录制，默认值为 false 关闭，关闭时，主持人入会自动开启云录制；当设置为开启时，则有参会成员入会自动开启云录制。
    # 说明：
    # 该参数必须 auto_record_type 设置为“cloud”时才生效，该参数依赖企业账户设置，当企业强制锁定后，该参数必须与企业配置保持一致。
    # 仅客户端2.7及以上版本生效。
    participant_join_auto_record: bool = None

    # 允许主持人暂停或者停止云录制，默认值为 true 开启，开启时，主持人允许暂停和停止云录制；当设置为关闭时，则主持人不允许暂停和关闭云录制。
    # 说明：
    # 该参数必须将 auto_record_type 设置为“cloud”时才生效，该参数依赖企业账户设置，当企业强制锁定后，该参数必须与企业配置保持一致。
    # 仅客户端2.7及以上版本生效。
    enable_host_pause_auto_record: bool = None

    # 是否允许成员多端入会。
    allow_multi_device: bool


class MeetingDetailSubMeeting(BaseModel):
    """
    子会议
    """

    # 子会议 ID。
    sub_meeting_id: str

    # 子会议状态。
    # 0：默认存在
    # 1：已删除
    status: int

    # 子会议开始时间（UTC 秒）。
    start_time: str

    # 子会议结束时间（UTC 秒）。
    end_time: str


class MeetingDetailRecurringRule(BaseModel):
    """
    周期性会议设置
    """
    # 重复类型，默认值为0。
    # 0：每天
    # 1：每周一至周五
    # 2：每周
    # 3：每两周
    # 4：每月
    # 5：自定义，示例请参见 自定义周期规则 API 调用示例
    recurring_type: int = None

    # 结束重复类型，默认值为0。
    # 0：按日期结束重复
    # 1：按次数结束重复
    until_type: int = None

    # 结束日期时间戳，默认值为当前日期 + 7天。
    until_date: int = None

    # 限定会议次数（1-50次），默认值为7次。
    until_count: int = None

    # 自定义周期性会议的循环类型。
    # 0：按天。
    # 1：按周。
    # 2：按月，以周为粒度重复。例如：每3个月的第二周的周四。
    # 3：按月，以日期为粒度重复。例如：每3个月的16日。
    # 按周；按月、以周为粒度； 按月、以日期为粒度时，需要包含会议开始时间所在的日期。
    customized_recurring_type: int = None

    # 每[n]（天、周、月）重复，使用自定义周期性会议时传入。
    # 例如：customized_recurring_type=0 && customized_recurring_step=5 表示每5天重复一次。
    # customized_recurring_type=2 && customized_recurring_step=3 表示每3个月重复一次，重复的时间依赖于 customized_recurring_days 字段。
    customized_recurring_step: int = None

    # 哪些天重复。
    # 根据 customized_recurring_type 和 customized_recurring_step 的不同，该字段可取值与表达含义不同。如需选择多个日期，加和即可。
    # customized_recurring_type = 0 时，传入该字段将被忽略。
    customized_recurring_days: int = None


class MeetingDetailLiveConfigLiveWatermark(BaseModel):
    """
    直播水印对象信息
    """
    # 水印选项，默认为0。
    # 0：默认水印
    # 1：无水印
    watermark_opt: int = None


class MeetingDetailLiveConfig(BaseModel):
    """
    会议的直播配置
    """
    # 直播主题。
    live_subject: str

    # 直播简介。
    live_summary: str

    # 直播密码
    live_password: str

    # 是否允许观众讨论，默认值为 false。
    # true：开启
    # false：不开启
    enable_live_im: bool

    # 是否开启直播回看，默认值为 false。
    # true：开启
    # false：不开启
    enable_live_replay: bool

    # 直播观看地址
    live_addr: str

    # 直播水印对象信息
    live_watermark: Optional[str] = None


class MeetingDetailGuest(BaseModel):
    """
    会议嘉宾
    """
    # 国家/地区代码（例如：中国传86，不是+86，也不是0086）
    area: str

    # 手机号
    phone_number: str

    # 嘉宾名称
    guest_name: str


class MeetingDetail(BaseModel):
    """
    会议详细信息对象
    """

    # 会议主题。
    subject: str

    # 会议的唯一标识。
    meeting_id: str

    # 会议 App 的呼入号码
    meeting_code: str

    # 会议密码
    password: str = None

    # 非会议创建者是否需要密码入会。
    # 非会议创建者查询会议，且存在会议密码，则字段为 true；其他情况，字段不返回。
    need_password: bool = None

    # 当前会议状态：
    # MEETING_STATE_INVALID：非法或未知的会议状态，错误状态。
    # MEETING_STATE_INIT：会议待开始。会议预定到预定结束时间前，会议尚无人进会。
    # MEETING_STATE_CANCELLED：会议已取消。主持人主动取消会议，待开始的会议才能取消，且取消的会议无法再进入。
    # MEETING_STATE_STARTED：会议已开始。会议中有人则表示会议进行中。
    # MEETING_STATE_ENDED：会议已删除。会议已过预定结束时间且尚无人进会时，主持人删除会议，已删除的会议无法再进入。
    # MEETING_STATE_NULL：会议无状态。会议已过预定结束时间，会议尚无人进会。
    # MEETING_STATE_RECYCLED：会议已回收。会议已过预定开始时间30天，则会议号将被后台回收，无法再进入。
    status: str

    # 会议类型：
    # 0：预约会议类型
    # 1：快速会议类型
    type: int

    # 加入会议 URL
    join_url: str

    # 指定主持人列表，仅商业版和企业版可指定主持人。
    hosts: Optional[List[MeetingDetailUser]] = None

    # 会议当前主持人列表。
    current_hosts: Optional[List[MeetingDetailUser]] = None

    # 联席主持人列表。
    current_co_hosts: Optional[List[MeetingDetailUser]] = None

    # 邀请的参会者，仅商业版和企业版可邀请参会用户，且只有会议创建者、邀请列表中的成员以及在会议中的成员才可以查询该字段，
    # 最多返回200个邀请者；需要查询超过200人的会议邀请者请调用 获取会议受邀成员列表 接口。
    participants: Optional[List[MeetingDetailUser]] = None

    # 会议开始时间戳（单位秒）。
    start_time: str or int

    # 会议结束时间戳（单位秒）。
    end_time: str or int

    # 会议的配置，可为缺省配置。
    settings: Optional[MeetingDetailSetting] = None

    # 会议类型。
    # 0：一次性会议
    # 1：周期性会议
    # 2：微信专属会议
    # 4：Rooms 投屏会议
    # 5：个人会议号会议
    # 6：网络研讨会
    meeting_type: int

    # 周期性会议设置。
    recurring_rule: Optional[MeetingDetailRecurringRule] = None

    # 周期性子会议列表（进行中或即将开始）。
    sub_meetings: Optional[List[MeetingDetailSubMeeting]] = None

    # 0：无更多子会议特例
    # 1：有更多子会议特例
    has_more_sub_meeting: int = None

    # 剩余子会议场数
    remain_sub_meetings: int = None

    # 当前子会议 ID（进行中或即将开始）。
    # 若已开完全部子会议，则返回最后一场子会议 ID。
    current_sub_meeting_id: str = None

    # 是否开启直播（会议创建人才有权限查询）。
    # true：开启
    # false：关闭
    enable_live: bool = None

    # 会议的直播配置（会议创建人才有权限查询）
    live_config: Optional[MeetingDetailLiveConfig] = None

    # 是否允许成员上传文档，默认为允许。
    enable_doc_upload_permission: bool

    # 会议嘉宾列表（会议创建人才有权限查询）。
    guests: Optional[List[MeetingDetailGuest]] = None

    # 是否有投票（会议创建人和主持人才有权限查询）。
    has_vote: bool = None

    # 是否激活报名。
    enable_enroll: bool

    # 是否开启主持人密钥。
    # true：开启
    # false：关闭
    enable_host_key: bool

    # 主持人密钥，仅支持6位数字（会议创建人才有权限查询）。
    # 如开启主持人密钥后没有填写此项，将自动分配一个6位数字的密钥。
    host_key: str = None

    # 会议是否同步至企业微信，该字段仅支持创建会议时设置，创建后无法修改。该配置仅支持与企业微信关联的企业。
    # true：同步，默认同步
    # false：不同步
    sync_to_wework: bool = None

    # 时区
    time_zone: str

    # 会议地点。最长支持18个汉字或36个英文字母。
    location: str

    # 0：公网会议
    # 1：专网会议
    # 仅开通混合云功能后支持该参数。
    media_set_type: int = None

    # 是否仅允许企业内网络访问入会， 仅专网会议类型返回。
    # false：不限制用户加入会议使用的网络
    # true： 仅允许通过企业内网络访问加入会议
    allow_enterprise_intranet_only: bool = None


class GetMeetingDetailData(BaseModel):
    meeting_number: int
    meeting_info_list: Optional[List[MeetingDetail]] = None


class GetMeetingDetailOutput(OutputBase):
    data: Optional[GetMeetingDetailData]
